package chapter02.part01;

import java.io.*;

/**
 * 开始学习输入输出流
 * 面向字节的流 InputStream & OutputStream 构成了 IO 的基础
 * 
 * @author insight
 * @since 2021/8/3
 */
public class ReadWriteByte {
    public static void main(String[] args) throws IOException {
        /* InputStream */
        
        // InputStream 的 read() 每个具体实现类的 read() 都不同
        // 读入一个字节并返回
        // 文件
        FileInputStream fileInputStream 
                = new FileInputStream("chapter02-io/src/main/resources/test.txt");
        // System.in InputStream 的一个子类的预定义对象 从控制台读入信息
        InputStream in = System.in;
        
        // Java 9 开始 有一个读取所有字节的方法
        byte[] bytes = fileInputStream.readAllBytes();
        // 读入一个字节数组
        int read = in.read(new byte[10]);
        // 跳过部分字节 读取固定长度
        int readByLen = in.read(new byte[10], 1, 10);
        // 跳过 n 个字节 返回实际跳过的字节数
        long skip = in.skip(10);
        // 在当前位置做标记 不是所有流都支持 如果读入字节已经超过 readlimit 忽略标记
        in.mark(10);
        // 当前流是否可以做标记
        boolean markSupported = in.markSupported();
        // 返回到最后一个标记的位置 之后 read() 会再次读取
        in.reset();
        // 及时关闭流 释放有限资源
        fileInputStream.close();
        in.close();
        
        /* OutputStream */
        OutputStream outputStream
                = new FileOutputStream("chapter02-io/src/main/resources/test.txt.bk");
        // 写入一个字节
        outputStream.write(0);
        // 写入一个字节数组
        outputStream.write(new byte[10]);
        // 字节传递 输入流->输出流 类似复制?
        fileInputStream.transferTo(outputStream);
        outputStream.write(1);
        
        // 由于 IO 会阻塞 可以使用 available 来获取不阻塞情况下可读取的字节数
        int available = fileInputStream.available();
        if (available > 0) {
            fileInputStream.readNBytes(available);
        }

        // 关闭输出流还会刷新缓冲区 也可以使用 flush 手动刷新
        outputStream.flush();
    }
}